home *** CD-ROM | disk | FTP | other *** search
/ Scene Storm / Scene Storm - Volume 1.iso / coding / c / pdc / dasm / disassem.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-04-19  |  3.6 KB  |  190 lines

  1. /* authored by Bill Rogers of New Zealand */
  2.  
  3. #include <stdio.h>
  4.  
  5. int c,endfin;
  6. FILE *fin;
  7.  
  8. int grabchar()
  9. {
  10.   int t;
  11.   t=c; endfin = ((c=getc(fin))==EOF); return t;
  12. }
  13.  
  14. int grabword()
  15. {
  16.   return ( grabchar()<<8 ) | grabchar();
  17. }
  18.  
  19. int grabthree()
  20. {
  21.   return ( grabchar()<<16 ) | grabword();
  22. }
  23.  
  24. int grablong()
  25. {
  26.   return ( grabword()<<16 ) | grabword();
  27. }
  28.  
  29. dumpdata(n)
  30. int n;
  31. {
  32.   int done=-1;
  33.   while ((n--)>0) {
  34.     if ( ++done % 4 ==0 ) printf("\n%4x: ",done);
  35.     printf(" %08x",grablong());
  36.     };
  37.   printf("\n");
  38. }
  39.  
  40. paddedstring(n)
  41. int n;
  42. {
  43.   char ch;
  44.   for (n=n<<2; n>0; n--)
  45.     if ((ch=grabchar())!=0) printf("%c",ch);
  46. }
  47.  
  48. int codesize, codeaddress;
  49.  
  50. nextcodeword()
  51. {
  52.   codeaddress +=2;
  53.   return (--codesize)>=0 ? grabword() : 0;
  54. }
  55.  
  56. dumpcode(n)
  57. int n;
  58. {
  59.   codesize=n*2; codeaddress=0;
  60.   while (codesize>0) decode(codeaddress);
  61. }
  62.  
  63. dumpreloc(b)
  64. int b;
  65. {
  66.   int n;
  67.   printf("\nHunk_Reloc%d\n",b);
  68.   while ((n=grablong())!=0) {
  69.     printf("For hunk number %d",grablong());
  70.     dumpdata(n);
  71.     }
  72. }
  73.  
  74. dumpsymboldata()
  75. {
  76.   int t,l;
  77.   while (1) {
  78.     t=grabchar();
  79.     l=grabthree();
  80.     if (t==0 & l==0) break;
  81.     switch (t) {
  82.       case 0:   printf("ext_symb");   break;
  83.       case 1:   printf("ext_def");    break;
  84.       case 2:   printf("ext_abs");    break;
  85.       case 3:   printf("ext_res");    break;
  86.       case 129: printf("ext_ref32");  break;
  87.       case 130: printf("ext_common"); break;
  88.       case 131: printf("ext_ref16");  break;
  89.       case 132: printf("ext_ref8");   break;
  90.       };
  91.     printf(" '");
  92.     paddedstring(l);
  93.     printf("'");
  94.     switch (t) {
  95.       case 0: case 1: case 2: case 3:
  96.         printf(" = %08x\n", grablong()); break;
  97.       case 129: case 131: case 132:
  98.         dumpdata(grablong()); break;
  99.       case 130:
  100.         printf(", size = %d", grablong());
  101.         dumpdata(grablong()); break;
  102.       }
  103.     }
  104. }
  105.  
  106. dumpitem()
  107. {
  108.   int l,f;
  109.   switch (l=grablong()) {
  110.     case 999:
  111.       printf("\nHunk_Unit: '");
  112.       paddedstring(grablong());
  113.       printf("'\n");
  114.       break;
  115.     case 1000:
  116.       printf("\nHunk_Name: '");
  117.       paddedstring(grablong());
  118.       printf("'\n");
  119.       break;
  120.     case 1001:
  121.       printf("\nHunk_Code\n");
  122.       dumpcode(grablong());
  123.       break;
  124.     case 1002:
  125.       printf("\nHunk_Data");
  126.       dumpdata(grablong());
  127.       break;
  128.     case 1003:
  129.       printf("\nHunk_bss - size = %d\n",grablong());
  130.       break;
  131.     case 1004:
  132.       dumpreloc(32);
  133.       break;
  134.     case 1005:
  135.       dumpreloc(16);
  136.       break;
  137.     case 1006:
  138.       dumpreloc(8);
  139.       break;
  140.     case 1007:
  141.       printf("\nHunk_Ext\n");
  142.       dumpsymboldata();
  143.       break;
  144.     case 1008:
  145.       printf("\nHunk_Symbol\n");
  146.       dumpsymboldata();
  147.       break;
  148.     case 1009:
  149.       printf("\nHunk_Debug\n");
  150.       dumpdata(grablong());
  151.       break;
  152.     case 1010:
  153.       printf("\nHunk_End\n");
  154.       break;
  155.     case 1011:
  156.       printf("\nHunk_Header\n");
  157.       while ((l=grablong())!=0) {
  158.         printf("Library: ");
  159.         paddedstring(l);
  160.         printf("\n");
  161.         };
  162.       printf("Table size = %d, using %d to %d\n",
  163.                       grablong(),(f=grablong()),(l=grablong()));
  164.       for (;f<=l;f++)
  165.         printf("     Size = %08x\n",grablong());
  166.       break;
  167.     case 1013:
  168.       printf("\nHunk_Overlay\n     Not Yet Implemented\n");
  169.       endfin=1; break;
  170.     case 1014:
  171.       printf("\nHunk_Break\n"); break;
  172.     case 1012:
  173.     default:
  174.       printf("Not a recognisable structure\n");
  175.       endfin=1;
  176.     }
  177. }
  178.  
  179. main(argc,argv)
  180. int argc;
  181. char *argv[];
  182. {
  183.   if ( ( fin = fopen( argv[1] , "r" ) ) == NULL )
  184.     printf("Couldn't open file >>%s<<\n",argv[1]);
  185.   else {
  186.     grabchar();
  187.     while (endfin==0) dumpitem();
  188.     }
  189. }
  190.